/// @ref gtx_io
/// @file glm/gtx/io2.hpp
/// @author Jan P Springer (regnirpsj@gmail.com)
///
/// @see core (dependence)
/// @see gtc_matrix_access (dependence)
/// @see gtc_quaternion (dependence)
///
/// @defgroup gtx_io GLM_GTX_io
/// @ingroup gtx
/// 
/// @brief std::[w]ostream support for glm types
///
/// std::[w]ostream support for glm types + precision/width/etc. manipulators
/// based on howard hinnant's std::chrono io proposal
/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html]
///
/// <glm/gtx/io.hpp> needs to be included to use these functionalities.

#pragma once

// Dependency:
#include "../glm.hpp"
#include "../gtx/quaternion.hpp"

#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)
# pragma message("GLM: GLM_GTX_io extension included")
#endif

#include <iosfwd>  // std::basic_istream<> (fwd)
#include <locale>  // std::locale, std::locale::facet, std::locale::id
#include <utility> // std::pair<>

namespace glm
{
    /// @addtogroup gtx_io
    /// @{

    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tquat<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tvec1<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tvec2<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tvec3<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tvec4<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat2x2<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat2x3<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat2x4<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat3x2<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat3x3<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat3x4<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat4x2<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat4x3<T, P> &);
    template <typename CTy, typename CTr, typename T, precision P>
    GLM_FUNC_DECL std::basic_istream<CTy, CTr>& operator>>(std::basic_istream<CTy, CTr>&, tmat4x4<T, P> &);

        /// @}
}//namespace glm

#include "io2.inl"
